import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import javax.swing.*;
import java.util.*;

/**
 * Write a description of class HtmlWorld here.
 * 
 * @author (Liz Rodriguez) 
 * @version (1.0)
 */
public class HtmlWorld extends World
{
    private Boton b1; // Boton para inicio de la aplicacion
    private Boton b2; // Boton para creditos de la aplicacion
    private Boton b3; // Boton para ayuda de la aplicacion
    private Boton b4; // Boton para tutoriales de la aplicacion
    private Boton b5; // Boton para atras de la aplicacion
    private Tutoriales t; //Tutorial para crear las notias de los tutoriasl
    private VistaPrevia vP; //Vista previa dependiendo del nivel en el que se encuentra
    private Revision rev; //Objeto de clase revision para la calificacion final
    private Hoja hoja;
    private List<String> listaNombresTags;
    private List<String> listaTagsDeHoja;
    private String bgVistaPrevia;
    protected Usuario jugador;
    private boolean Escenario;
    private int nivel = 5;
    
    /**
     * Variables para efectos de sonido
     */
    GreenfootSound inicio;
    GreenfootSound volver;
    GreenfootSound juego;
    GreenfootSound ganar;
    GreenfootSound perder;
    GreenfootSound click;
    /**
     * Constructor for objects of class HtmlWorld.
     * Se da tamaño y se inicializa desde el constructor todo el mundo 
     */
    public HtmlWorld()
    {    
        super(800, 600, 1); 
        Escenario = false;
        
        inicio = new GreenfootSound("inicio.mp3");
        volver = new GreenfootSound("volver.mp3");
        //juego = new GreenfootSound("virus.mp3");
        //ganar = new GreenfootSound("redoble.mp3");
        //perder = new GreenfootSound("perder.mp3");
        //click = new GreenfootSound("click.mp3");

        b1 = new Inicio();
        b2 = new Creditos();
        b3 = new Ayuda();
        b4 = new Tutoriales();
        b5 = new Atras();
        //Se inicializa la lista que contendra todos los nombres de los tags que ya estan 
        //acomodados
        listaNombresTags = new ArrayList<String>();         
        listaTagsDeHoja = new ArrayList<String>();
        //Se manda llamar al menu
        this.menu();
        //Se prepara la vista para la aplicacion
        prepare();
         
       
    }   
    
    /**
     * Menu es una funcion que crea el menu de la aplicacion posicionando en su lugar cada objeto
     * que forme parte del menu
     * @<Elemtos> 
     * b1 Boton de inicio a la aplicacion; 
     * b2 Boton de Creditos; 
     * b3 Boton de ayuda; 
     * b4 Boton de Tutoriales;
     */
    public void menu()
    {
        removeObjects(getObjects(null));
        setBackground("primerhtml.png");
        addObject(b1,697,66);
        addObject(b2,85,99);
        addObject(b3,149,525);
        addObject(b4,569,527);
        //inicio.play();
    }
    
    /**
     * 
     */
    public void act()
    {
        // Si escogen la opcion de INICIO es para dar comienzo a la aplicación
        if(Greenfoot.mouseClicked(b1)) 
        {
            removeObjects(getObjects(null));
            // click.play();
            setBackground("fondo.png");
            //agregamos el boton de regreso
            addObject(b5,67,548);
            this.cargaObjetos();
            jugador=new Usuario(this);
            Escenario=true;
            
        }
      
        // Opcion para ver los creditos
        if(Greenfoot.mouseClicked(b2))
        {
            //volver.play();
            removeObjects(getObjects(null));
            setBackground("creditosBackground.png");
            addObject(b5,609,544);
        }
        // Opcion para ver la ayuda
        if(Greenfoot.mouseClicked(b3))
        {
            if(!Escenario )
            {
                //juego.stop();
               // volver.play();
                Escenario=false;
                removeObjects(getObjects(null));
                setBackground("ayudaBackground.png");
                addObject(b5,600,555);            
            }
        }
        //Opcion para ver los tutoriales
        if(Greenfoot.mouseClicked(b4))
        {
            if(!Escenario )
            {
                //juego.stop();
                //volver.play();
                //Escenario=false;
                removeObjects(getObjects(null));
                setBackground("tutorialesBackground.png");
                addObject(b5,175,545);            
            }
            else //Si esta jugando 
            { 
                //volver.play();
                t = new Tutoriales(this);
                
            }
        }
        //Opcion para dar vuelta atras
        if(Greenfoot.mouseClicked(b5))
        {
            Escenario=false;
            removeObjects(getObjects(null));
            this.menu();           
        }
        
        //Opcion para dar inicio a la revision de la hoja 
        if(Escenario)
        {
            if(Greenfoot.mouseClicked(rev))
            {//comienza es el metodo para que revise las listas de evaluacion
                rev.comienza();
            }
        }
        
        //Opcion para dar paso al siguiente nivel
        
        
     }
     
     /**
      * Carga Objetos es una funcion que se encrga de cargar todos los 
      * objetos que necesitara el primer nivel para comenzar la aplicacion
      */
     public void cargaObjetos()
    {
        rev = new Revision(this);
        hoja = new Hoja();
        addObject(rev ,64,38);
        addObject(hoja,376,285);    
        addObject(new Solucion(),64,318);
        addObject(b4,60,445);
        switch(nivel)
        {
            case 1:
               bgVistaPrevia = "vistaPrevia.jpg";
            break;
            case 2:
                bgVistaPrevia = "vistaPrevia2.jpg";
            break;
            case 3:
                bgVistaPrevia = "vistaPrevia3.jpg";
            break;
            case 4:
                bgVistaPrevia = "vistaPrevia4.jpg";
            break;
            case 5:
                bgVistaPrevia = "vistaPrevia5.jpg";
            break;
            default: 
                bgVistaPrevia = "vistaPrevia.jpg";
        }
        vP = new VistaPrevia(this,bgVistaPrevia);
        addObject(vP,69,165);
    }
    
    /**
     * Prepare the world for the start of the program. That is: create the initial
     * objects and add them to the world.
     */
    private void prepare()
    {
    }
    
    /**
     *  Regresa el nivel en el que se encuentra el juego
     */
    public int dameNivel()
    {
        return nivel;
    }
    
    public void ponNivel(int n)
    {
        nivel = n;
    }
    
    /**
     * Cambio Nivel
     */
    public void cambioNivel()
    {
        this.remueveListas();
        removeObjects(getObjects(null));
        cargaObjetos();
        vP.avanzo();
    }
    
    /**
     * Remueve listas 
     * Al cambio de nivel se necesita volver a comenzar.
     */
    public void remueveListas()
    {
         while(!listaTagsDeHoja.isEmpty())
            listaTagsDeHoja.remove(0);
         while(!listaTagsDeHoja.isEmpty())
            listaNombresTags.remove(0);
    }
    
    /**
     * Este método agrega todos los tags dependiendo del nivel en el que esta de la hoja 
     * es decir es la lista con la que se debera comparar al iniciar la revision 
     * la manda llamar Vista previa en el momento de llenarla
     */
    public void meteTagsEnListaHoja(String tagEnHoja)
    {
        listaTagsDeHoja.add(tagEnHoja);
    }
    
    /**
     * Método que devuelve la lista de tags dependiendo del nivel en el que se encuentra el usuario,
     * todo esto para la evaluacion lo manda llamar la clase Revision
     */
    public List<String> dameListaDeTags()
    {
        return listaTagsDeHoja;
    }
    
    /**
     * Este método agrega todos los tags que ya estan acomodados donde corresponden en la hoja
     */
    public void meteTagsEnLista(String nombreTag)
    {
        //Se deberia de poner un ruidito de exito
        listaNombresTags.add(nombreTag);
    }
    
    /**
     * Este método saca de la lista los tags que ya estan acomodados por si se decide
     * cambiar de lugar o si erroneamente cambia su posicion del tag acomodado
     * regresa true si se pudo sacar el dato y false y no se pudo 
     */
    public boolean sacaTagsEnLista(String nombreTag)
    {   boolean res;
        res = listaNombresTags.remove(nombreTag);
        return res;
    }
    
    /**
     * Método que devuelve la lista de tags dependiendo del nivel que se tiene que acompletar todo esto para la evaluacion
     */
    public List<String>dameListaAEvaluar()
    {
        return  listaNombresTags; 
    }
}
